📊 Tutorial Completo de Plotly¶
Plotly Express e Graph Objects¶
Índice¶
- Setup e Imports
- Carregando os Dados
- Introdução ao Plotly Express
- Gráficos Básicos com Plotly Express
- Introdução ao Graph Objects (go)
- Gráficos Avançados com Graph Objects
- Customizações e Layouts
- Subplots com Plotly
- Interatividade
- Perguntas Comuns
Links Importantes:¶
#1 - Setup e Imports¶
Instalar plotly se necessário:
# Descomente a linha abaixo se precisar instalar
# !pip install plotly pandas numpy
Importar bibliotecas:
# Imports necessários
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np
# Para visualizar no Jupyter
import plotly.io as pio
pio.renderers.default = 'notebook'
# Carregar o dataset Heart
df = pd.read_csv('../../Datasets/Heart.csv')
df = df.drop(columns='Unnamed: 0')
print(f"Shape dos dados: {df.shape}")
df.head()
Shape dos dados: (303, 14)
| Age | Sex | ChestPain | RestBP | Chol | Fbs | RestECG | MaxHR | ExAng | Oldpeak | Slope | Ca | Thal | AHD | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 63 | 1 | typical | 145 | 233 | 1 | 2 | 150 | 0 | 2.3 | 3 | 0.0 | fixed | No |
| 1 | 67 | 1 | asymptomatic | 160 | 286 | 0 | 2 | 108 | 1 | 1.5 | 2 | 3.0 | normal | Yes |
| 2 | 67 | 1 | asymptomatic | 120 | 229 | 0 | 2 | 129 | 1 | 2.6 | 2 | 2.0 | reversable | Yes |
| 3 | 37 | 1 | nonanginal | 130 | 250 | 0 | 0 | 187 | 0 | 3.5 | 3 | 0.0 | normal | No |
| 4 | 41 | 0 | nontypical | 130 | 204 | 0 | 2 | 172 | 0 | 1.4 | 1 | 0.0 | normal | No |
# Informações básicas do dataset
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 303 entries, 0 to 302 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Age 303 non-null int64 1 Sex 303 non-null int64 2 ChestPain 303 non-null object 3 RestBP 303 non-null int64 4 Chol 303 non-null int64 5 Fbs 303 non-null int64 6 RestECG 303 non-null int64 7 MaxHR 303 non-null int64 8 ExAng 303 non-null int64 9 Oldpeak 303 non-null float64 10 Slope 303 non-null int64 11 Ca 299 non-null float64 12 Thal 301 non-null object 13 AHD 303 non-null object dtypes: float64(2), int64(9), object(3) memory usage: 33.3+ KB
# Criar coluna numérica para AHD
df['AHD_Numerical'] = df['AHD'].map({'No': 0, 'Yes': 1})
print("✅ Coluna AHD_Numerical criada!")
✅ Coluna AHD_Numerical criada!
# Criar dataframe agrupado por idade
df_groupedby_age = df.groupby('Age').mean(numeric_only=True).reset_index()
print(f"Dados agrupados por idade: {df_groupedby_age.shape}")
df_groupedby_age.head()
Dados agrupados por idade: (41, 12)
| Age | Sex | RestBP | Chol | Fbs | RestECG | MaxHR | ExAng | Oldpeak | Slope | Ca | AHD_Numerical | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 29 | 1.00 | 130.0 | 204.00 | 0.0 | 2.0 | 202.0 | 0.0 | 0.00 | 1.00 | 0.0 | 0.0 |
| 1 | 34 | 0.50 | 118.0 | 196.00 | 0.0 | 1.0 | 183.0 | 0.0 | 0.35 | 1.00 | 0.0 | 0.0 |
| 2 | 35 | 0.75 | 126.5 | 213.75 | 0.0 | 0.5 | 160.5 | 0.5 | 0.75 | 1.25 | 0.0 | 0.5 |
| 3 | 37 | 0.50 | 125.0 | 232.50 | 0.0 | 0.0 | 178.5 | 0.0 | 1.75 | 2.00 | 0.0 | 0.0 |
| 4 | 38 | 1.00 | 129.0 | 203.00 | 0.0 | 0.0 | 177.5 | 0.5 | 1.90 | 1.50 | 0.0 | 0.5 |
#3 - Introdução ao Plotly Express¶
Plotly Express é a API de alto nível do Plotly - rápida e simples!
Vantagens:¶
- Sintaxe simples e intuitiva
- Gráficos interativos automaticamente
- Menos código que matplotlib
- Integração perfeita com pandas
- Hover, zoom e pan já inclusos!
Sintaxe básica:¶
fig = px.tipo_de_grafico(dataframe, x='coluna_x', y='coluna_y')
fig.show()
# Scatterplot simples - Idade vs Colesterol
fig = px.scatter(df,
x='Age',
y='Chol',
title='Idade vs Colesterol')
fig.show()
Exemplo 2: Scatterplot com cores por categoria
# Scatterplot com cor por categoria
fig = px.scatter(df,
x='Age',
y='Chol',
color='AHD', # Colorir por diagnóstico
title='Idade vs Colesterol (por diagnóstico)',
labels={'Age': 'Idade', 'Chol': 'Colesterol'},
hover_data=['Sex', 'RestBP']) # Dados extras no hover
fig.show()
Exemplo 3: Scatterplot com tamanho variável
# Scatterplot com tamanho variável
fig = px.scatter(df,
x='RestBP',
y='Chol',
color='AHD',
size='MaxHR', # Tamanho baseado em MaxHR
title='Pressão vs Colesterol (tamanho = Max Heart Rate)',
opacity=0.6)
fig.show()
# Gráfico de linha - Colesterol médio por idade
fig = px.line(df_groupedby_age,
x='Age',
y='Chol',
title='Colesterol Médio por Idade',
markers=True) # Adiciona marcadores nos pontos
fig.show()
Exemplo 2: Múltiplas linhas
# Múltiplas linhas no mesmo gráfico
fig = px.line(df_groupedby_age,
x='Age',
y=['Chol', 'RestBP', 'MaxHR'],
title='Múltiplas Métricas por Idade',
labels={'value': 'Valor', 'variable': 'Métrica', 'Age': 'Idade'})
fig.show()
# Gráfico de barras - Colesterol médio por idade
fig = px.bar(df_groupedby_age,
x='Age',
y='Chol',
title='Colesterol Médio por Idade',
color='Chol', # Cor baseada no valor
color_continuous_scale='Blues')
fig.show()
Exemplo 2: Barras agrupadas
# Preparar dados para barras agrupadas
df_by_age_sex = df.groupby(['Age', 'Sex']).mean(
numeric_only=True).reset_index()
df_by_age_sex['Sex'] = df_by_age_sex['Sex'].map(
{0: 'Feminino', 1: 'Masculino'})
# Gráfico de barras agrupadas
fig = px.bar(df_by_age_sex,
x='Age',
y='Chol',
color='Sex',
barmode='group', # 'group' ou 'stack'
title='Colesterol Médio por Idade e Sexo',)
fig.show()
Exemplo 3: Barras horizontais
# Preparar dados
chest_pain_counts = df['ChestPain'].value_counts().reset_index()
chest_pain_counts.columns = ['ChestPain', 'Count']
# Gráfico de barras horizontal
fig = px.bar(chest_pain_counts,
y='ChestPain', # y em vez de x para horizontal
x='Count',
orientation='h',
title='Distribuição de Tipo de Dor no Peito',
color='Count',
color_continuous_scale='Blues')
fig.show()
# Histograma simples
fig = px.histogram(df,
x='Age',
nbins=20,
title='Distribuição de Idade',
labels={'Age': 'Idade'})
fig.show()
Exemplo 2: Histograma com overlay
# Histograma com overlay por categoria
fig = px.histogram(df,
x='Age',
color='AHD',
nbins=20,
title='Distribuição de Idade por Diagnóstico',
barmode='overlay', # 'overlay', 'stack' ou 'group'
opacity=0.7)
fig.show()
# Box plot simples
fig = px.box(df,
y='Chol',
title='Distribuição de Colesterol',
points='all') # Mostra todos os pontos
fig.show()
Exemplo 2: Box plot por categoria
# Box plot por categoria
fig = px.box(df,
x='AHD',
y='Chol',
color='AHD',
title='Colesterol por Diagnóstico de Doença Cardíaca',
points='outliers') # Mostra apenas outliers
fig.show()
🎻 Violin Plot¶
# Violin plot - mostra a distribuição
fig = px.violin(df,
x='AHD',
y='MaxHR',
color='AHD',
box=True, # Adiciona box plot interno
points='all', # Mostra pontos
title='Distribuição de Frequência Cardíaca Máxima')
fig.show()
🥧 Pie Chart (Gráfico de Pizza)¶
# Preparar dados
ahd_counts = df['AHD'].value_counts().reset_index()
ahd_counts.columns = ['AHD', 'Count']
# Gráfico de pizza
fig = px.pie(ahd_counts,
values='Count',
names='AHD',
title='Distribuição de Doenças Cardíacas',
color_discrete_sequence=px.colors.sequential.RdBu)
fig.show()
🔥 Heatmap (Mapa de Calor)¶
# Matriz de correlação
correlation_matrix = df[['Age', 'RestBP', 'Chol', 'MaxHR', 'Oldpeak']].corr()
fig = px.imshow(correlation_matrix,
text_auto=True, # Mostra valores
aspect='auto',
title='Matriz de Correlação',
color_continuous_scale='Blues')
fig.show()
#5 - Introdução ao Graph Objects (go)¶
Graph Objects oferece controle total sobre cada aspecto do gráfico!
Quando usar go em vez de px?¶
- Quando precisa de customização avançada
- Para criar gráficos complexos e únicos
- Quando precisa de controle fino sobre cada elemento
- Para construir gráficos incrementalmente
Sintaxe básica:¶
fig = go.Figure()
fig.add_trace(go.Scatter(x=..., y=...))
fig.update_layout(title=...)
fig.show()
# Scatter plot básico com go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df['Age'],
y=df['Chol'],
mode='markers',
marker=dict(size=8, color='blue', opacity=0.6),
name='Pacientes'
))
fig.update_layout(
title='Idade vs Colesterol',
xaxis_title='Idade',
yaxis_title='Colesterol',
hovermode='closest'
)
fig.show()
Múltiplas séries no mesmo gráfico:
# Separar por diagnóstico
df_healthy = df[df['AHD'] == 'No']
df_sick = df[df['AHD'] == 'Yes']
fig = go.Figure()
# Adicionar trace para pessoas saudáveis
fig.add_trace(go.Scatter(
x=df_healthy['RestBP'],
y=df_healthy['Chol'],
mode='markers',
name='Sem Doença',
marker=dict(size=8, color='green', opacity=0.6)
))
# Adicionar trace para pessoas doentes
fig.add_trace(go.Scatter(
x=df_sick['RestBP'],
y=df_sick['Chol'],
mode='markers',
name='Com Doença',
marker=dict(size=8, color='red', opacity=0.6)
))
fig.update_layout(
title='Pressão vs Colesterol por Diagnóstico',
xaxis_title='Pressão em Repouso',
yaxis_title='Colesterol',
hovermode='closest',
showlegend=True
)
fig.show()
📈 Line Chart com go¶
fig = go.Figure()
# Primeira linha
fig.add_trace(go.Scatter(
x=df_groupedby_age['Age'],
y=df_groupedby_age['Chol'],
mode='lines+markers',
name='Colesterol',
line=dict(color='blue', width=3),
marker=dict(size=8)
))
# Segunda linha
fig.add_trace(go.Scatter(
x=df_groupedby_age['Age'],
y=df_groupedby_age['RestBP'],
mode='lines+markers',
name='Pressão',
line=dict(color='red', width=3, dash='dash'),
marker=dict(size=8)
))
fig.update_layout(
title='Métricas Médias por Idade',
xaxis_title='Idade',
yaxis_title='Valor',
hovermode='x unified'
)
fig.show()
📊 Bar Chart com go¶
fig = go.Figure()
fig.add_trace(go.Bar(
x=df_groupedby_age['Age'],
y=df_groupedby_age['Chol'],
name='Colesterol',
marker_color='indianred'
))
fig.add_trace(go.Bar(
x=df_groupedby_age['Age'],
y=df_groupedby_age['RestBP'],
name='Pressão',
marker_color='lightsalmon'
))
fig.update_layout(
title='Comparação de Métricas por Idade',
xaxis_title='Idade',
yaxis_title='Valor',
barmode='group' # 'group', 'stack', 'relative'
)
fig.show()
🥧 Donut Chart com go¶
ahd_counts = df['AHD'].value_counts()
fig = go.Figure(data=[go.Pie(
labels=ahd_counts.index,
values=ahd_counts.values,
hole=0.3, # Cria um donut chart (0 = pie normal)
marker=dict(colors=['green', 'red']),
textinfo='label+percent',
hoverinfo='label+value+percent'
)])
fig.update_layout(
title='Distribuição de Doenças Cardíacas (Donut Chart)'
)
fig.show()
# Scatter plot super customizado
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df['Age'],
y=df['Chol'],
mode='markers',
marker=dict(
size=df['MaxHR'] / 10, # Tamanho variável
color=df['RestBP'], # Cor baseada em RestBP
colorscale='Viridis', # Escala de cores
showscale=True,
colorbar=dict(title="Pressão"),
line=dict(width=1, color='white') # Borda branca
),
text=df['AHD'],
hovertemplate='<b>Idade</b>: %{x}<br><b>Colesterol</b>: %{y}<br><b>Diagnóstico</b>: %{text}'
))
fig.update_layout(
title=dict(
text='Análise Avançada de Pacientes',
font=dict(size=24, color='darkblue')
),
xaxis=dict(
title='Idade',
gridcolor='lightgray',
showgrid=True
),
yaxis=dict(
title='Colesterol',
gridcolor='lightgray',
showgrid=True
),
plot_bgcolor='white',
hovermode='closest'
)
fig.show()
🖼️ Tamanho da Figura¶
fig = px.scatter(df, x='Age', y='Chol', color='AHD')
fig.update_layout(
width=1000, # Largura em pixels
height=600, # Altura em pixels
title='Gráfico com Tamanho Customizado'
)
fig.show()
Templates (Temas)¶
Temas disponíveis: plotly, plotly_white, plotly_dark, ggplot2, seaborn, simple_white, none
# Tema escuro
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='plotly_dark')
fig.update_layout(title='Tema Escuro')
fig.show()
# Tema seaborn
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='seaborn')
fig.update_layout(title='Tema Seaborn')
fig.show()
# Tema simples branco
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='simple_white')
fig.update_layout(title='Tema Simple White')
fig.show()
from plotly.subplots import make_subplots
# Criar figura com 2x2 subplots
fig = make_subplots(
rows=2, cols=2,
subplot_titles=('Scatter', 'Line', 'Bar', 'Box')
)
# Subplot 1: Scatter
fig.add_trace(
go.Scatter(x=df['Age'], y=df['Chol'], mode='markers', name='Scatter'),
row=1, col=1
)
# Subplot 2: Line
fig.add_trace(
go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['Chol'],
mode='lines', name='Line'),
row=1, col=2
)
# Subplot 3: Bar
fig.add_trace(
go.Bar(x=df_groupedby_age['Age'],
y=df_groupedby_age['RestBP'], name='Bar'),
row=2, col=1
)
# Subplot 4: Box
fig.add_trace(
go.Box(y=df['Chol'], name='Box'),
row=2, col=2
)
fig.update_layout(height=800, showlegend=False,
title_text="Dashboard de Subplots")
fig.show()
Subplots Verticais com Eixo X Compartilhado¶
fig = make_subplots(
rows=3, cols=1,
shared_xaxes=True, # Compartilha eixo X
vertical_spacing=0.05,
subplot_titles=('Colesterol', 'Pressão', 'Max HR')
)
fig.add_trace(
go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['Chol'],
name='Colesterol', line=dict(color='blue')),
row=1, col=1
)
fig.add_trace(
go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['RestBP'],
name='Pressão', line=dict(color='red')),
row=2, col=1
)
fig.add_trace(
go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['MaxHR'],
name='Max HR', line=dict(color='green')),
row=3, col=1
)
fig.update_layout(height=800, title_text="Métricas por Idade")
fig.update_xaxes(title_text="Idade", row=3, col=1)
fig.show()
Subplot Misto (Scatter + Pie)¶
fig = make_subplots(
rows=1, cols=2,
specs=[[{"type": "scatter"}, {"type": "domain"}]], # domain para pie
subplot_titles=('Scatter Plot', 'Pie Chart')
)
# Scatter plot
fig.add_trace(
go.Scatter(x=df['Age'], y=df['Chol'], mode='markers', name='Pacientes'),
row=1, col=1
)
# Pie chart
ahd_counts = df['AHD'].value_counts()
fig.add_trace(
go.Pie(labels=ahd_counts.index, values=ahd_counts.values, name='Diagnóstico'),
row=1, col=2
)
fig.update_layout(height=500, showlegend=True, title_text="Dashboard Misto")
fig.show()
# Criar gráfico com botões
fig = go.Figure()
# Adicionar todas as traces
fig.add_trace(go.Scatter(
x=df_groupedby_age['Age'],
y=df_groupedby_age['Chol'],
name='Colesterol',
visible=True # Visível por padrão
))
fig.add_trace(go.Scatter(
x=df_groupedby_age['Age'],
y=df_groupedby_age['RestBP'],
name='Pressão',
visible=False
))
fig.add_trace(go.Scatter(
x=df_groupedby_age['Age'],
y=df_groupedby_age['MaxHR'],
name='Max HR',
visible=False
))
# Criar botões
fig.update_layout(
updatemenus=[
dict(
buttons=list([
dict(label="Colesterol",
method="update",
args=[{"visible": [True, False, False]},
{"title": "Colesterol Médio por Idade"}]),
dict(label="Pressão",
method="update",
args=[{"visible": [False, True, False]},
{"title": "Pressão Média por Idade"}]),
dict(label="Max HR",
method="update",
args=[{"visible": [False, False, True]},
{"title": "Frequência Cardíaca Máxima por Idade"}]),
]),
direction="down",
showactive=True,
x=0.1,
y=1.15
)
],
title="Selecione a Métrica"
)
fig.show()
📊 Range Slider¶
fig = px.line(df_groupedby_age, x='Age', y='Chol',
title='Colesterol por Idade com Range Slider')
fig.update_xaxes(rangeslider_visible=True)
fig.show()
🔍 Hover Customizado e Detalhado¶
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df['Age'],
y=df['Chol'],
mode='markers',
marker=dict(size=10, color=df['RestBP'],
colorscale='Viridis', showscale=True),
text=df['AHD'],
customdata=np.column_stack((df['Sex'], df['RestBP'], df['MaxHR'])),
hovertemplate='<b>Idade:</b> %{x}<br>' +
'<b>Colesterol:</b> %{y}<br>' +
'<b>Diagnóstico:</b> %{text}<br>' +
'<b>Sexo:</b> %{customdata[0]}<br>' +
'<b>Pressão:</b> %{customdata[1]}<br>' +
'<b>Max HR:</b> %{customdata[2]}<br>' +
'<extra></extra>' # Remove o trace name
))
fig.update_layout(
title='Hover Customizado com Múltiplas Informações',
hovermode='closest'
)
fig.show()
fig = px.scatter(df, x='Age', y='Chol', color='AHD')
# Salvar como HTML (interativo)
fig.write_html("meu_grafico.html")
print("✅ Gráfico salvo como HTML!")
# Para salvar como imagem PNG/PDF, precisa instalar kaleido:
# !pip install kaleido
# fig.write_image("meu_grafico.png", width=1200, height=800)
# fig.write_image("meu_grafico.pdf")
✅ Gráfico salvo como HTML!
Como mudar a paleta de cores?¶
# Paletas qualitativas (categorias)
fig = px.scatter(df, x='Age', y='Chol', color='ChestPain',
color_discrete_sequence=px.colors.qualitative.Set2,
title='Paleta Set2')
fig.show()
# Paletas contínuas (valores numéricos)
fig = px.scatter(df, x='Age', y='Chol', color='RestBP',
color_continuous_scale='Viridis',
title='Escala Viridis')
# Outras: 'Plasma', 'Inferno', 'Turbo', 'Blues', 'Reds', 'RdBu'
fig.show()
# Ver todas as paletas disponíveis
print("Paletas qualitativas:")
print(dir(px.colors.qualitative))
print("\nPaletas sequenciais:")
print(dir(px.colors.sequential))
Paletas qualitativas: ['Alphabet', 'Alphabet_r', 'Antique', 'Antique_r', 'Bold', 'Bold_r', 'D3', 'D3_r', 'Dark2', 'Dark24', 'Dark24_r', 'Dark2_r', 'G10', 'G10_r', 'Light24', 'Light24_r', 'Pastel', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'Pastel_r', 'Plotly', 'Plotly_r', 'Prism', 'Prism_r', 'Safe', 'Safe_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'T10', 'T10_r', 'Vivid', 'Vivid_r', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swatches', 'swatches'] Paletas sequenciais: ['Aggrnyl', 'Aggrnyl_r', 'Agsunset', 'Agsunset_r', 'Blackbody', 'Blackbody_r', 'Bluered', 'Bluered_r', 'Blues', 'Blues_r', 'Blugrn', 'Blugrn_r', 'Bluyl', 'Bluyl_r', 'Brwnyl', 'Brwnyl_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'Burg', 'Burg_r', 'Burgyl', 'Burgyl_r', 'Cividis', 'Cividis_r', 'Darkmint', 'Darkmint_r', 'Electric', 'Electric_r', 'Emrld', 'Emrld_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'Hot', 'Hot_r', 'Inferno', 'Inferno_r', 'Jet', 'Jet_r', 'Magenta', 'Magenta_r', 'Magma', 'Magma_r', 'Mint', 'Mint_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'Oryel', 'Oryel_r', 'Peach', 'Peach_r', 'Pinkyl', 'Pinkyl_r', 'Plasma', 'Plasma_r', 'Plotly3', 'Plotly3_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuRd', 'PuRd_r', 'Purp', 'Purp_r', 'Purples', 'Purples_r', 'Purpor', 'Purpor_r', 'Rainbow', 'Rainbow_r', 'RdBu', 'RdBu_r', 'RdPu', 'RdPu_r', 'Redor', 'Redor_r', 'Reds', 'Reds_r', 'Sunset', 'Sunset_r', 'Sunsetdark', 'Sunsetdark_r', 'Teal', 'Teal_r', 'Tealgrn', 'Tealgrn_r', 'Turbo', 'Turbo_r', 'Viridis', 'Viridis_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swatches', '_swatches_continuous', 'algae', 'algae_r', 'amp', 'amp_r', 'deep', 'deep_r', 'dense', 'dense_r', 'gray', 'gray_r', 'haline', 'haline_r', 'ice', 'ice_r', 'matter', 'matter_r', 'solar', 'solar_r', 'speed', 'speed_r', 'swatches', 'swatches_continuous', 'tempo', 'tempo_r', 'thermal', 'thermal_r', 'turbid', 'turbid_r']
Como adicionar anotações?¶
fig = px.scatter(df, x='Age', y='Chol')
fig.add_annotation(
x=67,
y=568,
text="Ponto de atenção!",
showarrow=True,
arrowhead=2,
arrowsize=1,
arrowwidth=2,
arrowcolor="red",
font=dict(size=14, color="red"),
bgcolor="yellow",
opacity=0.8
)
fig.show()
Como adicionar linhas de referência?¶
fig = px.scatter(df, x='RestBP', y='Chol')
# Linha horizontal
fig.add_hline(y=250, line_dash="dash", line_color="red",
annotation_text="Limite de colesterol")
# Linha vertical
fig.add_vline(x=140, line_dash="dash", line_color="blue",
annotation_text="Limite de pressão")
fig.show()
Como criar gráfico 3D?¶
fig = px.scatter_3d(df,
x='Age',
y='RestBP',
z='Chol',
color='AHD',
size='MaxHR',
title='Visualização 3D',
opacity=0.7)
fig.show()
Como remover a barra de ferramentas?¶
fig = px.scatter(df, x='Age', y='Chol')
# Remove o modebar (barra de ferramentas)
fig.show(config={'displayModeBar': False})
Como fazer animações?¶
# Criar dados temporais simulados
df_temp = df.copy()
df_temp['Year'] = np.random.choice([2020, 2021, 2022, 2023], size=len(df))
fig = px.scatter(df_temp,
x='Age',
y='Chol',
animation_frame='Year', # Cria animação
color='AHD',
size='MaxHR',
range_x=[20, 80],
range_y=[100, 600],
title='Animação por Ano')
fig.show()
Como adicionar múltiplas anotações?¶
fig = px.scatter(df, x='Age', y='Chol', color='AHD')
# Adicionar várias anotações
annotations = [
dict(x=40, y=400, text="Zona 1", showarrow=False, bgcolor="lightblue"),
dict(x=60, y=300, text="Zona 2", showarrow=False, bgcolor="lightgreen"),
dict(x=70, y=500, text="Zona 3", showarrow=False, bgcolor="lightyellow")
]
fig.update_layout(annotations=annotations,
title="Gráfico com Múltiplas Anotações")
fig.show()
Como fazer um gráfico de área?¶
fig = px.area(df_groupedby_age,
x='Age',
y='Chol',
title='Gráfico de Área - Colesterol por Idade')
fig.show()
Como criar um gráfico de densidade (contorno)?¶
fig = px.density_contour(df,
x='Age',
y='Chol',
title='Densidade - Idade vs Colesterol')
fig.show()
# Com cores preenchidas
fig = px.density_heatmap(df,
x='Age',
y='Chol',
title='Heatmap de Densidade')
fig.show()
Como criar um gráfico de sunburst?¶
# Preparar dados hierárquicos
df_sunburst = df.groupby(['AHD', 'ChestPain']).size().reset_index(name='Count')
fig = px.sunburst(df_sunburst,
path=['AHD', 'ChestPain'],
values='Count',
title='Sunburst - Diagnóstico e Tipo de Dor')
fig.show()
Resumo Final¶
Plotly Express (px) vs Graph Objects (go)¶
| Aspecto | Plotly Express | Graph Objects |
|---|---|---|
| Sintaxe | Simples, uma linha | Mais verbosa |
| Velocidade de código | Rápido | Mais código |
| Customização | Limitada | Controle total |
| Melhor para | Exploração rápida | Visualizações complexas |
| Curva de aprendizado | Fácil | Média |
Quando usar cada um?¶
Use Plotly Express quando:
- Está explorando dados rapidamente
- Precisa de um gráfico simples
- O gráfico padrão já atende suas necessidades
Use Graph Objects quando:
- Precisa de customização avançada
- Quer controle total sobre cada elemento
- Está criando dashboards complexos
- Precisa adicionar traces incrementalmente
Desafios para Praticar¶
Tente criar estes gráficos por conta própria:
Desafio 1: Criar um dashboard 2x2 com:
- Scatter plot de Age vs MaxHR
- Box plot de Chol por ChestPain
- Histogram de RestBP
- Pie chart de Sex
Desafio 2: Criar um gráfico interativo com botões que alternam entre:
- Scatter plot
- Line plot
- Bar plot (dos mesmos dados)
Desafio 3: Criar um gráfico 3D com Age, Chol e RestBP, colorido por AHD
Desafio 4: Criar um heatmap de correlação estilizado com:
- Cores customizadas
- Valores nas células
- Título e labels personalizados